﻿
/*
 * Javasript based on Functions(JBF) 1.03
 * 
 * Copyright(c) 2010, Fooxee (JA86.CN)
 *
 * JBF is licensed under the terms of the Open Source GPL 3.0(http://www.gnu.org/licenses/gpl.html) license. 
 * 
 * JBF's blog: http://www.cnblogs.com/JBF/
 * 
 * Created by Fooxee. at 2010.03.08  mailTo:hjccjun@163.com
 */

/*
#summary JBF.Date 文档.

= JBF.Date =

对象:JBF.Date

文件:core/Date.js

描述:Date操作.

|| [#Public_Config 配置项] || [#Public_Properties 属性] || [#Public_Methods 方法] || [事件] ||

=== Public Config ===
公开配置

|| *格式* || *值或例* || *描述* ||
|| *天* ||
|| d || 01 - 31 			|| 2位数字表示的天数.有前导零 ||
|| D || Mon - Sun 			|| 星期几的英文缩写 ||
|| j || 1 - 31 				|| 数字表示的号数.没有前导零 ||
|| l || Sunday - Saturday	|| 星期几的名称 ||
|| N || 1(周一) - 7(周日)		|| ISO-8601中数字表示的星期数(几) ||
|| S || st, nd, rd/th 		|| 表示号数的英文名后缀,2位字符 ||
|| w || 0(周日) - 6(周六)		|| 数字表示的星期数(几) ||
|| z || 0 - 365 			|| 数字表示1年中的一天,从0开始,非闰年为364天 ||
|| *周* ||
|| W || 01 - 53 			|| ISO-8601中表示的一年中的一周,每周从周一开始 ||
|| *月* ||
|| F || 一月 - 十二月 		|| 月的名称 |
|| m || 01 - 12 			|| 数字表示的月数,有前导零 ||
|| M || Jan - Dec			|| 月的英文缩写 ||
|| n || 1 - 12 				|| 数字表示的月数,没有前导零 ||
|| t || 28 - 31 			|| 数字表示的月天数,没有前导零 ||
|| *年* ||
|| L || 0或1 				|| 是否为闰年,1为闰年,否则为0 ||
|| o || 1998 / 2004 		|| ISO-8601 定义的年数字.它跟Y定义的值一样,只是如果W定义的周属于上年或下年,那么这个值将被W定义的年所替换. ||
|| Y || 0000 				|| 4位数字表示的年 ||
|| y || 00 					|| 2位数字表示的年,如2010表示为10 ||
|| *时间* ||
|| a || am/pm 				|| 小写字母的上午或下午 ||
|| A || AM/PM 				|| 大写字母的上午或下午 ||
|| g || 1-12 				|| 12小时制,没有前导零 ||
|| G || 0-23 				|| 24小时制,从0开始,没有前导零 ||
|| h || 01-12 				|| 12小时制,有前导零 ||
|| H || 00-23 				|| 24小时制,从0开始,有前导零 ||
|| i || 00-59 				|| 分钟数,有前导零 ||
|| s || 00-59 				|| 秒数,有前导零 ||
|| u || 654321 				|| 微秒 ||
|| *时区* ||
|| *全日期/时间* ||

*/
JBF.Date={

/*

=== Public Properties ===
公开属性
|| *属性* || *值类型* || *描述* ||
*/ 
	
	/*
	|| weeks	|| Object	|| 周名称 ||
	*/
	weeks:{'1':'周一','2':'周二','3':'周三','4':'周四','5':'周五','6':'周六','7':'周日'},
	/*
	|| weekEnames	|| Object	|| 周英文名称 ||
	*/
	weekEnames:{'1':'Monday','2':'Tuesday','3':'Wednesday','4':'Thursday','5':'Friday','6':'Saturday','7':'Sunday'},
	
	/*
	|| months	|| Object	|| 月名称 ||
	*/
	months:{'1':'一月','2':'二月','3':'三月','4':'四月','5':'五月','6':'六月','7':'七月','8':'八月','9':'九月','10':'十月','11':'十一月','12':'十二月'},
	/*
	|| monthEnames|| Object	|| 月英文名称 ||
	*/
	monthEnames:{'1':'January','2':'February','3':'March','4':'April','5':'May','6':'June','7':'July','8':'August','9':'September','10':'October','11':'November','12':'December'},
	
	/*
	|| quarters|| Object	|| 季度名称 ||
	*/
	quarters:{'1':'一季度','2':'二季度','3':'三季度','4':'四季度'},
	
	/*
	|| patterns|| Object	|| 常用的日期格式 ||
	*patterns*
	{{{
		patterns:{
			ISO8601Long:"Y-m-d H:i:s",
			ISO8601Short:"Y-m-d",
			ShortDate: "n/j/Y",
			LongDate: "l, F d, Y",
			FullDateTime: "l, F d, Y g:i:s A",
			MonthDay: "F d",
			ShortTime: "g:i A",
			LongTime: "g:i:s A",
			SortableDateTime: "Y-m-d\\TH:i:s",
			UniversalSortableDateTime: "Y-m-d H:i:sO",
			YearMonth: "F, Y"
		}
	}}}
	*/
	patterns:{
		ISO8601Long:"Y-m-d H:i:s",
		ISO8601Short:"Y-m-d",
		ShortDate: "n/j/Y",
		LongDate: "l, F d, Y",
		FullDateTime: "l, F d, Y g:i:s A",
		MonthDay: "F d",
		ShortTime: "g:i A",
		LongTime: "g:i:s A",
		SortableDateTime: "Y-m-d\\TH:i:s",
		UniversalSortableDateTime: "Y-m-d H:i:sO",
		YearMonth: "F, Y"
	},

/*

=== Public Methods ===
公开方法

*/ 

	/*
	<hr>
	*format*(Datetime date,String pattern):String
	格式化日期.<br>
	参数
	|| *参数名* || *值类型* || *描述* ||
	|| date 	|| Datetime 	|| 给定的日期 ||
	|| pattern 	|| String 		|| 格式,可参见 [#Public_Config 配置项] ||
	
	*返回*:String 格式化后的日期字符串
	*/
	format:function(date,pattern)
	{
		//字符串附加(需要写到String类中)
		var leftPad=function(s,n,ss){
			s=s+'';
			if(JBF.len(s)<n)
			{
				var tss='';
				for(var i=0;i<n-JBF.len(s);i++)
					tss +=ss;
				s=tss+s;
			}
			return s;
		};
		
		//格式化类型(现在效率不是很高,有时间再重写)
		//详见:<a href="http://www.php.net/date">PHP's date</a>
		var o={
		q:Math.floor((date.getMonth()+3)/3),							//季度0
		Q:this.quarters[Math.floor((date.getMonth()+3)/3)],				//季度 名称
		d: leftPad(date.getDate(),2,'0'),								//日01-31
        D: this.weekEnames[date.getDay()+1].substr(0,3),				//星期 名称 缩写
        j: date.getDate(),												//日1 - 31
        l: this.weeks[date.getDay()+1],									//星期 名称
        N: date.getDay()+1,												//1(周一) - 7(周日) 
        S: this.getSuffix(date),										//英文名后缀 st, nd, rd或th 
        w: date.getDay(),												//0(周日) - 6(周六) 
        z: this.getDaysOfYear(date),									//一年中的一天数,从0开始 
        W: leftPad(this.getWeekOfYear(date),2,'0'),						//ISO-8601中表示的一年中的周数
        F: this.months[date.getMonth()+1],								//月 名称 缩写
        m: leftPad(date.getMonth()+1,2,'0'),							//月01-12
        M: this.monthEnames[date.getMonth()+1].substr(0,3),				//月 名称
        n: date.getMonth() + 1,											//数字表示的月份数
        t: this.getDaysInMonth(date),									//月的最大天数
        L: this.isLeapYear(date) ? 1 : 0,								//是否闰年
        o: (date.getFullYear() + (this.getWeekOfYear(date) == 1 && date.getMonth() > 0 ? +1 : (this.getWeekOfYear(date) >= 52 && date.getMonth() < 11 ? -1 : 0))),//ISO8601定义的年数
        Y: date.getFullYear(),											//年0000
        y: date.getFullYear().toString().substr(2,2),					//年00
        a: date.getHours() < 12 ? 'am' : 'pm',							//小写字母的上午或下午 
        A: date.getHours() < 12 ? 'AM' : 'PM',
        g: ((date.getHours() % 12) ? date.getHours() % 12 : 12),		//12小时制,没有前导零 
        G: date.getHours(),												//24小时制,从0开始,没有前导零 
        h: leftPad(date.getHours(),2,'0'),								//时01-12
        H: leftPad(date.getHours(),2,'0'),								//时00-24
        i: leftPad(date.getMinutes(),2,'0'),							//分00-59
        s: leftPad(date.getSeconds(),2,'0'),							//秒00-59
        u: leftPad(date.getMilliseconds(),3,'0'),						//毫秒000
        O: this.getGMTOffset(date),
        P: this.getGMTOffset(date,true),
        T: this.getTimezone(date),
        Z: (date.getTimezoneOffset() * -60),
		c: '',															// ISO-8601 -- GMT format
		U: Math.round(date.getTime() / 1000)							//Seconds since the Unix Epoch (January 1 1970 00:00:00 GMT) 
		};
		
		//循环替换
		JBF.each(o,function(v,i,list)
		{
			if(new RegExp("("+ v +")").test(pattern))
			{
				pattern = pattern.replace(RegExp.$1, list[v]);      
			} 
		});     
		return pattern;
		
	},
	
	/*
	<hr>
	*isLeapYear*(Datetime date):Boolean
	是否是闰年.<br>
	参数
	|| *参数名* || *值类型* || *描述* ||
	|| date 	|| Datetime 	|| 给定的日期 ||
	
	*返回*:Boolean
	*/
	isLeapYear:function(date)
	{
		var year = date.getFullYear();
        return !!((year & 3) == 0 && (year % 100 || (year % 400 == 0 && year)));
	},
	
	
	/*
	<hr>
	*diff*(String interval,Datetime d1,Datetime d2):Int
	两个日期比较.<br>
	参数
	|| *参数名* || *值类型* || *描述* ||
	|| interval	|| String 		|| 比较类型('y','Y','m','n','d','j','h','H','i','s','u','w','g','G'),可参见 [#Public_Config 配置项] || 
	|| d1 		|| Datetime 	|| 给定的日期1 ||
	|| d2 		|| Datetime 	|| 给定的日期2 ||
	
	*返回*:Int 时间差
	*/
	diff:function(interval,d1,d2)
	{
		var o=['y','Y','m','n','d','j','h','H','i','s','u','w','g','G'];
		var bool=false;
		JBF.each(o,function(v)
		{
			if(v==interval)
			{
				bool=true;
				return;
			}
		});
		if(bool)
		{
			if(interval=='Y' || interval=='y')
			{
				return parseInt(this.format(d1,interval))-parseInt(this.format(d2,interval));
			}
			else if(interval=='m' || interval=='n')
			{
				var y=parseInt(this.format(d1,'Y'))-parseInt(this.format(d2,'Y'));
				var m=parseInt(this.format(d1,'m'))-parseInt(this.format(d2,'m'));
				return y*12+m;
			}
			else if(interval=='d' || interval=='j')
			{
				var y=parseInt(this.getDaysOfYear(d1))-parseInt(this.getDaysOfYear(d2));
				var m=parseInt(this.format(this.getDaysOfMonth(d1),'d'))-parseInt(this.format(this.getDaysOfMonth(d2),'d'));
				var d=parseInt(this.format(d1,'d'))-parseInt(this.format(d2,'d'));
				return y+m+d;
			}
			else if(interval=='h' || interval=='H' || interval=='g' || interval=='G')
			{
				var y=parseInt(this.getDaysOfYear(d1))-parseInt(this.getDaysOfYear(d2));
				var m=parseInt(this.format(this.getDaysOfMonth(d1),'d'))-parseInt(this.format(this.getDaysOfMonth(d2),'d'));
				var d=parseInt(this.format(d1,'d'))-parseInt(this.format(d2,'d'));
				var h=parseInt(this.format(d1,'h'))-parseInt(this.format(d2,'h'));
				return (y+m+d)*24+h;
			}
			else if(interval=='i')
			{
				var y=parseInt(this.getDaysOfYear(d1))-parseInt(this.getDaysOfYear(d2));
				var m=parseInt(this.format(this.getDaysOfMonth(d1),'d'))-parseInt(this.format(this.getDaysOfMonth(d2),'d'));
				var d=parseInt(this.format(d1,'d'))-parseInt(this.format(d2,'d'));
				var h=parseInt(this.format(d1,'h'))-parseInt(this.format(d2,'h'));
				var i=parseInt(this.format(d1,'i'))-parseInt(this.format(d2,'i'));
				return ((y+m+d)*24+h)*60+i;
			}
			else if(interval=='s')
			{
				var y=parseInt(this.getDaysOfYear(d1))-parseInt(this.getDaysOfYear(d2));
				var m=parseInt(this.format(this.getDaysOfMonth(d1),'d'))-parseInt(this.format(this.getDaysOfMonth(d2),'d'));
				var d=parseInt(this.format(d1,'d'))-parseInt(this.format(d2,'d'));
				var h=parseInt(this.format(d1,'h'))-parseInt(this.format(d2,'h'));
				var i=parseInt(this.format(d1,'i'))-parseInt(this.format(d2,'i'));
				var s=parseInt(this.format(d1,'s'))-parseInt(this.format(d2,'s'));
				return (((y+m+d)*24+h)*60+i)*60+s;
			}
			else if(interval=='u')
			{
				var y=parseInt(this.getDaysOfYear(d1))-parseInt(this.getDaysOfYear(d2));
				var m=parseInt(this.format(this.getDaysOfMonth(d1),'d'))-parseInt(this.format(this.getDaysOfMonth(d2),'d'));
				var d=parseInt(this.format(d1,'d'))-parseInt(this.format(d2,'d'));
				var h=parseInt(this.format(d1,'h'))-parseInt(this.format(d2,'h'));
				var i=parseInt(this.format(d1,'i'))-parseInt(this.format(d2,'i'));
				var s=parseInt(this.format(d1,'s'))-parseInt(this.format(d2,'s'));
				var u=parseInt(this.format(d1,'u'))-parseInt(this.format(d2,'u'));
				return ((((y+m+d)*24+h)*60+i)*60+s)*1000+u;
			}
			else if(interval=='w')
			{
				var y=parseInt(this.getDaysOfYear(d1))-parseInt(this.getDaysOfYear(d2));
				var m=parseInt(this.format(this.getDaysOfMonth(d1),'d'))-parseInt(this.format(this.getDaysOfMonth(d2),'d'));
				var d=parseInt(this.format(d1,'d'))-parseInt(this.format(d2,'d'));
				var h=parseInt(this.format(d1,'h'))-parseInt(this.format(d2,'h'));
				var i=parseInt(this.format(d1,'i'))-parseInt(this.format(d2,'i'));
				var s=parseInt(this.format(d1,'s'))-parseInt(this.format(d2,'s'));
				var u=parseInt(this.format(d1,'u'))-parseInt(this.format(d2,'u'));
				return ((((y+m+d)*24+h)*60+i)*60+s)*1000+u;
			}
		}
		return 'NaN';
	},
	
	/*
	<hr>
	*addDays*(Datetime date,Int d):Datetime
	向一个日期中添加天数.<br>
	参数
	|| *参数名* || *值类型* || *描述* ||
	|| date 	|| Datetime 	|| 给定的日期 || 
	|| s 		|| Int		 	|| 天数 ||
	
	*返回*:Datetime 新日期
	*/
	addDays:function(date,d)
	{
		date.setDate(date.getDate() + (d||0));
		return date;
	},
	
	/*
	<hr>
	*addWeeks*(Datetime date,Int w):Datetime
	向一个日期中添加周数.<br>
	参数
	|| *参数名* || *值类型* || *描述* ||
	|| date 	|| Datetime 	|| 给定的日期 || 
	|| w 		|| Int		 	|| 周数 ||
	
	*返回*:Datetime 新日期
	*/
	addWeeks:function(date,w)
	{
		return this.addDays(date,(w||0) * 7);
	},
	
	/*
	<hr>
	*addMonths*(Datetime date,Int m):Datetime
	向一个日期中添加月数.<br>
	参数
	|| *参数名* || *值类型* || *描述* ||
	|| date 	|| Datetime 	|| 给定的日期 || 
	|| m 		|| Int		 	|| 月数 ||
	
	*返回*:Datetime 新日期
	*/
	addMonths:function(date,m)
	{
		date.setMonth(date.getMonth() +1+ (m||0));
		return date;
	},
	
	/*
	<hr>
	*addYears*(Datetime date,Int y):Datetime
	向一个日期中添加年数.<br>
	参数
	|| *参数名* || *值类型* || *描述* ||
	|| date 	|| Datetime 	|| 给定的日期 || 
	|| y 		|| Int		 	|| 年数 ||
	
	*返回*:Datetime 新日期
	*/
	addYears:function(date,y)
	{
		date.setFullYear(date.getFullYear() + (y||0));
		return date
	},
	
	/*
	<hr>
	*getDayOfYear*(Datetime date):Datetime
	获取给定日期是一年中的第几天.<br>
	参数
	|| *参数名* || *值类型* || *描述* ||
	|| date 	|| Datetime 	|| 给定的日期 || 
	
	*返回*:Datetime 新日期
	*/
	getDayOfYear: function(date) {
        var num = 0,
            d = date,
            m = date.getMonth(),
            i;

        for (i = 0, d.setDate(1), d.setMonth(0); i < m; d.setMonth(++i))
		{
            num += this.getDaysInMonth(date);
        }
        return num + date.getDate() - 1;
    },
	
	/*
	<hr>
	*getWeekOfYear*(Datetime date):Datetime
	获取给定日期是一年中的第几周.<br>
	参数
	|| *参数名* || *值类型* || *描述* ||
	|| date 	|| Datetime 	|| 给定的日期 || 
	
	*返回*:Datetime 新日期
	*/
	getWeekOfYear:function(date)
	{
		// adapted from http://www.merlyn.demon.co.uk/weekcalc.htm
        var ms1d = 864e5, //1天的总秒数
            ms7d = 7 * ms1d; // 一周的总秒数

        var DC3 = Date.UTC(date.getFullYear(), date.getMonth(), date.getDate() + 3) / ms1d, // 绝对天数
		AWN = Math.floor(DC3 / 7), //绝对周数
		Wyr = new Date(AWN * ms7d).getUTCFullYear();
		
		return AWN - Math.floor(Date.UTC(Wyr, 0, 7) / ms7d) + 1;
	},
	
	/*
	<hr>
	*getDaysOfYear*(Datetime date):Datetime
	获取给定日期的年的总天数.<br>
	参数
	|| *参数名* || *值类型* || *描述* ||
	|| date 	|| Datetime 	|| 给定的日期 || 
	
	*返回*:Datetime 新日期
	*/
	getDaysOfYear:function(date)
	{
		if(this.isLeapYear(date))
			return 356;	
		else
			return 355;	
	},
	
	/*
	<hr>
	*getDaysOfMonth*(Datetime date):Datetime
	获取给定日期的月的总天数.<br>
	参数
	|| *参数名* || *值类型* || *描述* ||
	|| date 	|| Datetime 	|| 给定的日期 || 
	
	*返回*:Datetime 新日期
	*/
	getDaysOfMonth:function(date)
	{
		return this.getLastDateOfMonth(this.format(date,'Y'),this.format(date,'m'));////////////////////////////////////////////////
	},
	
	/*
	<hr>
	*getDaysInMonth*(Datetime date):Datetime
	获取月的最大天数.<br>
	参数
	|| *参数名* || *值类型* || *描述* ||
	|| date 	|| Datetime 	|| 给定的日期 || 
	
	*返回*:Datetime 新日期
	*/
	getDaysInMonth: function(date)
	{
		var daysInMonth = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];

        var m = date.getMonth();
		return m == 1 && this.isLeapYear(date) ? 29 : daysInMonth[m];
    },
	
	getTimezone : function(date)
	{
        return date.toString().replace(/^.* (?:\((.*)\)|([A-Z]{1,4})(?:[\-+][0-9]{4})?(?: -?\d+)?)$/, "$1$2").replace(/[^A-Z]/g, "");
    },
	//
	getGMTOffset : function(date,colon) 
	{
		var leftPad=function(s,n,ss){
			s=s+'';
			if(JBF.len(s)<n)
			{
				var tss='';
				for(var i=0;i<n-JBF.len(s);i++)
					tss +=ss;
				s=tss+s;
			}
			return s;
		};
        return (date.getTimezoneOffset() > 0 ? "-" : "+")
            + leftPad(Math.floor(Math.abs(date.getTimezoneOffset()) / 60), 2, "0")
            + (colon ? ":" : "")
            + leftPad(Math.abs(date.getTimezoneOffset() % 60), 2, "0");
    },
	
	/*
	<hr>
	*getFirstDateOfWeek*(Datetime date,Int offset):Datetime
	取得指定日期的周一的日期.<br>
	参数
	|| *参数名* || *值类型* || *描述* ||
	|| date 	|| Datetime 	|| 给定的日期 || 
	|| Int 		|| offset 	|| 偏移量,偏移单位为当前计算类型(可为正负整数,默认为0) ||
	
	*返回*:Datetime 新日期
	*/
	getFirstDateOfWeek:function(date,offset)
	{
		offset=(offset||0)*7;
		date.setDate(date.getDate()+1+offset-date.getDay());
		return date;
	},
	
	/*
	<hr>
	*getLastDateOfWeek*(Datetime date,Int offset):Datetime
	取得指定日期的周日的日期.<br>
	参数
	|| *参数名* || *值类型* || *描述* ||
	|| date 	|| Datetime 	|| 给定的日期 || 
	|| Int 		|| offset 	|| 偏移量,偏移单位为当前计算类型(可为正负整数,默认为0) ||
	
	*返回*:Datetime 新日期
	*/
	getLastDateOfWeek:function(date,offset)
	{
		offset=(offset||0)*7;
		date.setDate(date.getDate()+7+offset-date.getDay());
		return date;
	},

	/*
	<hr>
	*getFirstDateOfMonth*(Datetime date,Int offset):Datetime
	取得指定月的第一天.<br>
	参数
	|| *参数名* || *值类型* || *描述* ||
	|| date 	|| Datetime 	|| 给定的日期 || 
	|| Int 		|| offset 	|| 偏移量,偏移单位为当前计算类型(可为正负整数,默认为0) ||
	
	*返回*:Datetime 新日期
	*/
	getFirstDateOfMonth:function(date,offset)
	{
		date=this.addMonths(date,(offset||0)-1);
		date.setDate(1);
		return date;
	},
	
	/*
	<hr>
	*getLastDateOfMonth*(Datetime date,Int offset):Datetime
	取得指定月的最后一天.<br>
	参数
	|| *参数名* || *值类型* || *描述* ||
	|| date 	|| Datetime 	|| 给定的日期 || 
	|| Int 		|| offset 	|| 偏移量,偏移单位为当前计算类型(可为正负整数,默认为0) ||
	
	*返回*:Datetime 新日期
	*/
	getLastDateOfMonth:function(date,offset)
	{
		date=this.addMonths(date,(offset||0));
		date.setDate(0);
		return date;
	},
	
	/*
	<hr>
	*getFirstDateOfQuarter*(Datetime date,Int offset):Datetime
	取得指定月的季度的第一天.<br>
	参数
	|| *参数名* || *值类型* || *描述* ||
	|| date 	|| Datetime 	|| 给定的日期 || 
	|| Int 		|| offset 	|| 偏移量,偏移单位为当前计算类型(可为正负整数,默认为0) ||
	
	*返回*:Datetime 新日期
	*/
	getFirstDateOfQuarter:function(date,offset)
	{
		date=this.getFirstDateOfMonth(date,(offset||0)*3);
		var m=parseInt(this.format(date,'n'));
		if(m>=1 && m<=3)
			date.setMonth(0);
		else if(m>=4 && m<=6)
			date.setMonth(3);
		else if(m>=7 && m<=9)
			date.setMonth(6);
		else if(m>=10 && m<=12)
			date.setMonth(9);
		return date;
	},
	
	/*
	<hr>
	*getLastDateOfQuarter*(Datetime date,Int offset):Datetime
	取得指定月的季度的最后一天.<br>
	参数
	|| *参数名* || *值类型* || *描述* ||
	|| date 	|| Datetime 	|| 给定的日期 || 
	|| Int 		|| offset 	|| 偏移量,偏移单位为当前计算类型(可为正负整数,默认为0) ||
	
	*返回*:Datetime 新日期
	*/
	getLastDateOfQuarter:function(date,offset)
	{
		date=this.getLastDateOfMonth(date,(offset||0)*3);
		var m=parseInt(this.format(date,'n'));
		if(m>=1 && m<=3)
			date.setMonth(2);
		else if(m>=4 && m<=6)
			date.setMonth(5);
		else if(m>=7 && m<=9)
			date.setMonth(8);
		else if(m>=10 && m<=12)
			date.setMonth(11);
		return date;
	},
	
	/*
	<hr>
	*getSuffix*(Datetime date,Int offset):Datetime
	获取英文后缀.<br>
	参数
	|| *参数名* || *值类型* || *描述* ||
	|| date 	|| Datetime 	|| 给定的日期 || 
	
	*返回*:Datetime 新日期
	*/
	getSuffix : function(date)
	{
        switch (date.getDate())
		{
            case 1:
            case 21:
            case 31:
                return "st";
            case 2:
            case 22:
                return "nd";
            case 3:
            case 23:
                return "rd";
            default:
                return "th";
        }
    }
};